package persistence

import (
	"fmt"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"

	"Data-API-MCP/backend/configs"
)

var (
	db *gorm.DB
)

// InitDB 初始化数据库连接
func InitDB(config *configs.Config) error {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=%v&loc=%s",
		config.Database.MySQL.Username,
		config.Database.MySQL.Password,
		config.Database.MySQL.Host,
		config.Database.MySQL.Port,
		config.Database.MySQL.DBName,
		config.Database.MySQL.Charset,
		config.Database.MySQL.ParseTime,
		config.Database.MySQL.Loc,
	)

	var err error
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	})
	if err != nil {
		return fmt.Errorf("failed to connect to database: %v", err)
	}

	sqlDB, err := db.DB()
	if err != nil {
		return fmt.Errorf("failed to get database instance: %v", err)
	}

	// 设置连接池参数
	sqlDB.SetMaxIdleConns(config.Database.MySQL.MaxIdleConns)
	sqlDB.SetMaxOpenConns(config.Database.MySQL.MaxOpenConns)
	sqlDB.SetConnMaxLifetime(time.Duration(config.Database.MySQL.ConnMaxLifetime) * time.Second)

	return nil
}

// GetDB 获取数据库连接
func GetDB() *gorm.DB {
	return db
}

// CloseDB 关闭数据库连接
func CloseDB() error {
	if db != nil {
		sqlDB, err := db.DB()
		if err != nil {
			return err
		}
		return sqlDB.Close()
	}
	return nil
}
